Block的本质
Block
Block的本质就是C语言中的指针函数调用。我们平时在OC中写的Block代码,在clang编译的时候,都会被转换成一个静态函数,并通过Struct包装他的函数地址,用来方便进行调用。
对于Block中自动捕获的变量,会在创建block Struct的时候赋值给到struct 内的一个变量。
Block在经过clang编译后,会被转成三块实现:
- 是BlockImpl的结构体
- 是static的静态函数,实际上就是我们写的block的实际实现代码,
- 是BlockImplDesc,用来描述当前Block的size等信息。
对于用__block 进行描述的变量,在实际编译过程中,会变成一个堆里面的对象。
不同的Block类型
通过打印Block的类型,可以看到Block有几个不同的类型。
- _NSConcreteStackBlock 栈上Block
- _NSConcreteGlobalBlock 全局Block
- _NSConcreteMallocBlock 堆上Block 将block作为函数返回值时,编译器会自动生成复制到堆上的代码。或者使用copy
__block 标记的对象
使用 __block 标记符标记的变量,会变被包装成一个对象。